1

@[toc]

前言

Lua 是一种轻量小巧的脚本语言,用标准C语言编写,并开源。

其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学里的一个研究小组(由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成)于1993年开发。

只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
提供多线程(协同进程,并非操作系统所支持的线程)支持;

p s:协同进程内部发起http请求的时候会导致设备卡死

I、基础常用功能

  • iPhone自动解锁
init("0", 0);
require "TSLib"
while (true) do

    if deviceIsLock()  == 1 then    --判断设备是否锁定
        unlockDevice()--解锁无密码的设备
    end
end
  • 遍历打印table的两种方式
if type(response_body) == "table" then  
                    for k, v in pairs(response_body) do  
                        -- print( v)  
                        -- print( type(v))
                        str2 = v
                    end  
                end  
 if type(response_body) == "table" then
        sysLog("《"..table.concat(response_body).."》")
        else
        sysLog("Not a table:", type(response_body))
    end
  • 获取点坐标以及对应的颜色
   x,y = catchTouchPoint();
           sysLog("catchTouchPoint"..x..","..y);
            r,g,b = getColorRGB(x,y);
            sysLog("getColor:"..r..","..g..","..b);

  • lua 请求不走wifi 的代理,, 只能设置设备的hosts
iPhone:/etc root# echo "192.168.2.254 alimama.fuge.cn" > /etc/hosts
iPhone:/etc root# echo '127.0.0.1 localhost' >> /etc/hosts

II、生产者-消费者问题

现在我就使用Lua的协同程序来完成生产者-消费者这一经典问题。

生产者-消费者问题
现在我就使用Lua的协同程序来完成生产者-消费者这一经典问题。
local newProductor

function productor()
     local i = 0
     while true do
          i = i + 1
          send(i)     -- 将生产的物品发送给消费者
     end
end

function consumer()
     while true do
          local i = receive()     -- 从生产者那里得到物品
          print(i)
     end
end

function receive()
     local status, value = coroutine.resume(newProductor)
     return value
end

function send(x)
     coroutine.yield(x)     -- x表示需要发送的值,值返回以后,就挂起该协同程序
end

-- 启动程序
newProductor = coroutine.create(productor)
consumer()

适用于 执行一个任务(生产),上报数据给服务端(消费),开启下一个任务的场景。

生产一次,消费一次。

III Http4lua

- lua 发起的Content-Type 为application/json; charset=UTF-8的请求的封装httpPostJson

--local json = require "json"
local sz = require("sz")
local json = sz.json
local http = require("szocket.http")
require "TSLib"



local globalIOS8 = -1
local globalIOS9 = -1

function isiOS8()

    if globalIOS8 == -1 then
        if  string.byte( osversion ,1) == string.byte( "8" ,1) then
            globalIOS8 = 1
        else
            globalIOS8 = 0
        end     
    end

    return globalIOS8 == 1
end

function isiOS9()
    if globalIOS9 == -1 then
        if  string.byte( osversion ,1) == string.byte( "9" ,1) then
            globalIOS9 = 1
        else
            globalIOS9 = 0
        end     
    end

    return globalIOS9 == 1

end

function isiOS10()
    return isiOS8() == false and isiOS9() == false
end





w,h = getScreenSize()



function clearDeviceData(...)
    clearPasteboard()--清除设备剪贴板信息
    clearCookies() --清除浏览器Cookies信息
end


function click2(pt)
    touchDown(pt.x, pt.y)
    mSleep(60)
    touchUp(pt.x, pt.y)
end

function click(x, y)
    touchDown(x, y)
    mSleep(60)
    touchUp(x, y)
end


function findMultiColorInRect( colorTable , rc )
    x,y=findMultiColorInRegionFuzzyByTable(colorTable,90, rc.x1 , rc.y1 , rc.x2 , rc.y2 )
    return x,y
end

function findMultiColorInRectBool( colorTable , rc )
    x,y=findMultiColorInRegionFuzzyByTable(colorTable,90, rc.x1 , rc.y1 , rc.x2 , rc.y2 )
    if x ~= -1 and y ~= -1 then
        return true
    else
        return false
    end
end

--return handled
function findAndClick( colorTable , rc )

    x,y= findMultiColorInRect( colorTable , rc)

    if x ~= -1 and y ~= -1 then
        mSleep(500)
        click(x,y)
        return true
    else
        return false
    end

end


local myToken = "dinghao"

function httpPost( http_url , content_type , http_body  )
    
    sysLog("《httpPost start 》http_url: "..http_url);
    sysLog("content_type: "..content_type);
    sysLog("http_body :")
    if type(http_body) == "table" then
        sysLog(table.concat(http_body))
        else
        if(not(http_body == nil)) then
            sysLog("Not a table:"..http_body)
        end
    end
    
    
    local response_body = {}  
    local res, code, response_headers = http.request{  
        url = http_url,  
        method = "POST",  
        headers =  
        {  
            ["Content-Type"] = content_type;  
            ["Content-Length"] = #http_body;  
        },  
        source = ltn12.source.string(http_body),  
        sink = ltn12.sink.table(response_body),  
    }
    decode3 = {};
    --notifyMessage("res is:"..res);
    sysLog("《httpPost end 》");
    if(not(res == nil)) then
        sysLog("res:"..res);
        
    else
    --code: timeout
    res= "";
    sysLog("code: "..code);
    
    --输出返回的信息到特定文件
    
    -- 以附加的方式打开只写文件
    file = io.open("/var/root/lualog.text", "a")
    -- 在文件最后一行添加 Lua 注释
    -- 设置默认输出文件为 test.lua
    io.output(file)
    
    if type(response_body) == "table" then
        file:write("--res:"..res.." code:"..code.." response_body:"..table.concat(response_body).."\n")
        else
        file:write("--res:"..res.." code:"..code.." response_body[1]:"..type(response_body).."\n")
    end
    
    -- 关闭打开的文件
    file:close()

    return res,code,decode3
    
    end
    sysLog("code: "..code);
    
    
    
    sysLog("Response body:")
    if type(response_body) == "table" then
        sysLog("《"..table.concat(response_body).."》")
        else
        sysLog("Not a table:", type(response_body))
    end
    
    
    if (not(response_body[1] == nil)) then
        decode3 = json.decode( response_body[1] )--第一个元素是string
      
     end
        
    
    return res,code,decode3
end

function httpPostJson(http_url , json_body_table )
    assert( type(json_body_table) == "table" )
    return httpPost(http_url,"application/json; charset=UTF-8", json.encode( json_body_table ) )
end


local globalURL = ""


local smsStatusProcessing = 2
local smsStatusFailed = 3
local smsStatusFinished = 4
  • httpPostJson的使用例子:
  local postTable = {};
             --测试网站
    
   local  res,code,response_body = httpPostJson(urlTable["getNew"], postTable);
     
     --notifyMessage("res is:"..res);
     sysLog("response_body "..table.concat(response_body));
     sysLog(res)
     sysLog("Response body:")
     if type(response_body) == "table" then
         sysLog(table.concat(response_body))
         else
         sysLog("Not a table:", type(response_body))
     end
     
     --send("timeout")     -- 将生产的物品发送给消费者,告诉后台转换超时
     send(table.concat(response_body))     -- 将生产的物品发送给消费者

    writePasteboard(code);
  • 通过封装的 httpPostJson请求上报数据
- function KNreport(report)

if not(type(report) == "table") then
    return;
end

getnewurl = ""..urlbaseTable[getenv()]..methodurlTable["report"];
local  res,code,response_body = httpPostJson(getnewurl, report);

--send("timeout")     -- 
--send()     -- 

local jsonBody= response_body;
sysLog("jsonBody :"..table.concat(response_body));

code = jsonBody["Code"];
sysLog("Code:"..code.."type"..type(Code));           --break;

if( code == 201 ) then
    
    sysLog("201:");           --break;
    elseif (code == 200 )   then
    sysLog("上报成功!");           --break;
end
end

see also

多行注释推荐使用 --[=[注释内容]=]


iOS逆向
44 声望15 粉丝